package cnsatmsmart.automation.mmi.model.layers;

/**
 * @author SIK - PTIK, BPPT
 **/

import com.bbn.openmap.omGraphics.OMGraphic;
import com.bbn.openmap.proj.Projection;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.io.Serializable;

public class OMLabelCircle extends OMGraphic implements Serializable {
    /* const */
        private static final Color FIXES_COLOR = new Color (225, 225, 225, 100);
            //nilai warna default untuk pewarnaan pada penggambaran lingkaran yang merupakan instance dari kelas OMLabelCircle
        private static final int FIXES_RADIUS = 16;
            //nilai jari-jari default pada penggambaran lingkaran yang merupakan instance dari kelas OMLabelCircle
    
    /* atribut - atribut yang dimiliki oleh kelas OMLabelCircle */
        private float latitude;             //posisi titik pusat object pada garis lintang
        private float longitude;            //posisi titik pusat object pada garis bujur
        private int xPoint = 0;             //posisi titik pusat object pada bidang kartesian searah sumbu axis
        private int yPoint = 0;             //posisi titik pusat object pada bidang kartesian searah sumbu ordinat
        private int radius = FIXES_RADIUS;  //jari-jari object
        private String label;               //label dari object
        private Color color = FIXES_COLOR;  //warna dari object
        private boolean fill = false;       //bernilai true jika dan hanya jika object solid dan sebaliknya false jika dan hanya jika penggambaran hanya berupa outline saja

    /* constructor - user defined ctor, no default ctor */
        // <editor-fold defaultstate="collapsed" desc="ctor">
        /**
         * menginstansiasi object OMLabelCircle yang mana :<br />
         * - memiliki titik pusat pada koordinat lintang - bujur (lat, lon)<br />
         * - memiliki jari-jari FIXES_RADIUS - const private static final int = 16<br />
         * - tidak memiliki label<br />
         * - memiliki warna FIXES_COLOR - const private static final Color = new Color (225, 225, 225, 100)<br />
         * - tidak solid dan hanya berupa outline
         * @param lat float yang merupakan posisi titik pusat lingkaran pada koordinat lintang
         * @param lon float yang merupakan posisi titik pusat lingkaran pada koordinat bujur
         */
        public OMLabelCircle(float lat, float lon) {
            this(lat, lon, FIXES_RADIUS, null, FIXES_COLOR, false);
        }
        /**
         * menginstansiasi object OMLabelCircle yang mana :<br />
         * - memiliki titik pusat pada koordinat lintang - bujur (lat, lon)<br />
         * - memiliki jari-jari rad<br />
         * - tidak memiliki label<br />
         * - memiliki warna FIXES_COLOR - const private static final Color = new Color (225, 225, 225, 100)<br />
         * - tidak solid dan hanya berupa outline
         * @param lat float yang merupakan posisi titik pusat lingkaran pada koordinat lintang
         * @param lon float yang merupakan posisi titik pusat lingkaran pada koordinat bujur
         * @param rad int yang merupakan jari-jari lingkaran dalam pixel
         */
        public OMLabelCircle(float lat, float lon, int rad) {
            this(lat, lon, rad, null, FIXES_COLOR, false);
        }
        /**
         * menginstansiasi object OMLabelCircle yang mana :<br />
         * - memiliki titik pusat pada koordinat lintang - bujur (lat, lon)<br />
         * - memiliki jari-jari rad<br />
         * - tidak memiliki label<br />
         * - memiliki warna color<br />
         * - memiliki mode pengisian bergantung kepada fill
         * @param lat float yang merupakan posisi titik pusat lingkaran pada koordinat lintang
         * @param lon float yang merupakan posisi titik pusat lingkaran pada koordinat bujur
         * @param rad int yang merupakan jari-jari lingkaran dalam pixel
         * @param color java.awt.Color yang merupakan warna dari lingkaran
         * @param fill boolean : true jika diinginkan lingkaran yang solid dan sebaliknya false jika diinginkan lingkaran yang tidak solid dan hanya berupa outline
         */
        public OMLabelCircle(float lat, float lon, int rad, Color color, boolean fill) {
            this(lat, lon, rad, null, color, fill);
        }
        /**
         * menginstansiasi object OMLabelCircle yang mana :<br />
         * - memiliki titik pusat pada koordinat lintang - bujur (lat, lon)<br />
         * - memiliki jari-jari FIXES_RADIUS - const private static final int = 16<br />
         * - memiliki label dengan teks label<br />
         * - memiliki warna FIXES_COLOR - const private static final Color = new Color (225, 225, 225, 100)<br />
         * - tidak solid dan hanya berupa outline
         * @param lat float yang merupakan posisi titik pusat lingkaran pada koordinat lintang
         * @param lon float yang merupakan posisi titik pusat lingkaran pada koordinat bujur
         * @param label string yang merupakan teks yang akan dikandung oleh label
         */
        public OMLabelCircle(float lat, float lon, String label) {
            this(lat, lon, FIXES_RADIUS, label, FIXES_COLOR, false);
        }
        /**
         * menginstansiasi object OMLabelCircle yang mana :<br />
         * - memiliki titik pusat pada koordinat lintang - bujur (lat, lon)<br />
         * - memiliki jari-jari rad<br />
         * - memiliki label dengan teks label<br />
         * - memiliki warna FIXES_COLOR - const private static final Color = new Color (225, 225, 225, 100)<br />
         * - tidak solid dan hanya berupa outline
         * @param lat float yang merupakan posisi titik pusat lingkaran pada koordinat lintang
         * @param lon float yang merupakan posisi titik pusat lingkaran pada koordinat bujur
         * @param rad int yang merupakan jari-jari lingkaran dalam pixel
         * @param label string yang merupakan teks yang akan dikandung oleh label
         */
        public OMLabelCircle(float lat, float lon, int rad, String label) {
            this(lat, lon, rad, label, FIXES_COLOR, false);
        }
        /**
         * menginstansiasi object OMLabelCircle yang mana :<br />
         * - memiliki titik pusat pada koordinat lintang - bujur (lat, lon)<br />
         * - memiliki jari-jari rad<br />
         * - memiliki label dengan teks label<br />
         * - memiliki warna color<br />
         * - memiliki mode pengisian bergantung kepada fill
         * @param lat float yang merupakan posisi titik pusat lingkaran pada koordinat lintang
         * @param lon float yang merupakan posisi titik pusat lingkaran pada koordinat bujur
         * @param rad int yang merupakan jari-jari lingkaran dalam pixel
         * @param label string yang merupakan teks yang akan dikandung oleh label
         * @param color java.awt.Color yang merupakan warna dari lingkaran
         * @param fill boolean : true jika diinginkan lingkaran yang solid dan sebaliknya false jika diinginkan lingkaran yang tidak solid dan hanya berupa outline
         */
        public OMLabelCircle(float lat, float lon, int rad, String label, Color color, boolean fill) {
            this.latitude = lat;
            this.longitude = lon;
            this.radius = rad;
            this.label = label;
            this.color = color;
            this.fill = fill;
        }
        // </editor-fold>

    /**
     * Prepare the graphic for rendering. This must be done before calling render()! If a vector graphic has lat-lon components, then we project these vertices into x-y space. For raster graphics we prepare in a different fashion.<br />
     * If the generate is unsuccessful, it's usually because of some oversight, (for instance if proj is null), and if debugging is enabled, a message may be output to the controlling terminal.<br />
     * membangkitkan graphics dan mempersiapkannya untuk rendering bergantung kepada projection saat ini
     * @param prjctn Projection yang merupakan projection saat ini
     * @return boolean : true jika dan hanya jika pembangkitan berhasil dilakukan dan false jika sebaliknya
     */
    @Override
    public boolean generate (Projection prjctn) {
        Point point = prjctn.forward(this.latitude, this.longitude);

        this.xPoint = point.x;
        this.yPoint = point.y;
    
        return (true);
    }

    /**
     * Paint the graphic. This paints the graphic into the Graphics context. This is similar to paint() function of java.awt.Components. Note that if the graphic has not been generated, it will not be rendered.<br />
     * This method used to be abstract, but with the conversion of OMGraphics to internally represent themselves as java.awt.Shape objects, it's a more generic method. If the OMGraphic hasn't been updated to use Shape objects, it should have its own render method.<br />
     * melakukan rendering lingkaran jika dan hanya jika graphics sudah dibangkitkan
     * @param graphics Graphics yang merupakan konteks lingkaran yang akan dirender
     */
    @Override
    public void render (Graphics graphics) {
        Graphics2D g2d = (Graphics2D) graphics;
        g2d.setColor(this.color);

        if (isSelected()) {
            setGraphicsColor(graphics, Color.ORANGE);
        }

        if (this.fill) {
            g2d.fillOval((this.xPoint - (this.radius / 2)), (this.yPoint - (this.radius / 2)), this.radius, this.radius);
        } else {
            g2d.drawOval((this.xPoint - (this.radius / 2)), (this.yPoint - (this.radius / 2)), this.radius, this.radius);
        }

        if (this.label != null) {
            g2d.drawString(this.label, this.xPoint, this.yPoint);
        }
    }
}
